import axios from 'axios';
import { ElMessage as Message } from 'element-plus'; // 导入 Message 组件
import router from '@/router'; // 确保引入 Vue Router 实例
import { useTokenStore } from '@/stores/token';
class Service {
  
  constructor() {
    this.service = axios.create({
      baseURL: '/adminApi', // 统一域名定义在这里
      timeout: 50000 // 超时时间定义在这里
    });
   
    // 添加请求拦截器
    this.service.interceptors.request.use(

      config => {

        const tokenStore = useTokenStore();

        // 在发送请求之前做些什么
        const token = localStorage.getItem('token');
        if (token) {
          config.headers['Authorization'] = `${token}`;
        }
        return config;
      },
      error => {
        // 对请求错误做些什么
        return Promise.reject(error);
      }
    );

    // 添加响应拦截器
    this.service.interceptors.response.use(
      response => {
        console.log('请求成功:', useTokenStore.token);
        // 对响应数据做点什么
        return response;
      },
      error => {
        // 对响应错误做点什么
        console.error('请求失败:', error);
        if (error.response) {
          if (error.response.data && error.response.data.errorCode === 20003) {
            this.refreshToken().then(() => {
              return this.service(error.config);
            }).catch(refreshError => {
              console.error('刷新 Token 失败:', refreshError);
              return Promise.reject(error);
            });
          } else if (error.response.data && error.response.data.message) {
            console.error('显示错误信息:', error.response.data.errorCode);
            if (error.response.data.errorCode === 20000) {
                console.error('使用 Vue Router 跳转到登录页面:', error.response.data.errorCode);

                localStorage.removeItem('token');

                router.push('/login'); // 使用 Vue Router 跳转到登录页面
                
            }

            Message.error(error.response.data.message); // 显示错误信息
          }
        }
        return Promise.reject(error);
      }
    );
  }

  post(url, data) {
    return this.service.post(url, data);
  }

  //封装get方法 
  get(url, params) {
    return this.service.get(url, { params });
  }
  
  /**
   * 执行删除操作
   * 
   * 该方法用于调用服务层的删除方法，以实现资源的删除
   * 主要作用是封装删除请求的逻辑，提供一个简洁的接口
   * 
   * @param {string} url - 要删除的资源的URL
   * @returns {any} 返回服务层删除方法的结果，具体类型取决于服务层的实现
   */
  delete(id) {
    return this.service.delete(id);
  }

  // 添加 put 方法
  put(url, data) {
    return this.service.put(url, data);
  }

  refreshToken() {
    // 实现刷新 token 的逻辑
    return this.service.post('/auth/refresh').then(response => {
      const newToken = response.data.token;
      localStorage.setItem('token', newToken);
    });
  }
}

export { Service };